home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / post2_g2 / src / p_bangou.c < prev    next >
Text File  |  1997-10-13  |  17KB  |  714 lines

  1. /*
  2.     post / 郵便番号検索プログラム
  3.  
  4.     p_bangou.c / 番号検索部
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <sys/dos.h>
  11. #include <ctype.h>
  12. #include <mbstring.h>
  13. #include "post.h"
  14.  
  15.  
  16. /*
  17.     番号検索メイン
  18. */
  19. void
  20. bangou_kensaku()
  21. {
  22.     int    len,            /* 長さ */
  23.         point[B_GEN],        /* ofs 格納用 */
  24.         uchikiri = 0,        /* 打ち切りビット(ないと思うけど) */
  25.         nextp = 0,        /* 次検索位置 */
  26.         kensuu = 0,        /* 検索ヒット件数 */
  27.         gen_page = 0,        /* 現在のページ数 */
  28.         zen_page = 0,        /* 全ページ数 */
  29.         kijun = 0,        /* 表示用基準 */
  30.         ki = 0,            /* 基準から算出した件数 */
  31.         aza_sw = 0,        /* 字名スイッチ */
  32.         s_num = 0,        /* 選択用 */
  33.         mainlp = 0,        /* 表示ループ用 */
  34.         lp = 0,            /* 表示ループ用(その2) */
  35.         lpcnt = 0,        /* 表示ループ用(その2) */
  36.         shitei_ku_unkn = 0,    /* 指定都市内の区名が不明スイッチ(長いねどうも) */
  37.         b_ofs = 0,        /* 「以下の……」チェック用 */
  38.         i1;            /* ループ汎用 */
  39.  
  40.     uchar    bwork[12],        /* 番号ワーク */
  41.         ydelim;            /* 番号検索用デリミタ */
  42.  
  43.     uchar    joukyou[B_GEN],        /* ヒット時のオフセット */
  44.         ichien[B_GEN];        /* 町村一円スイッチ */
  45.  
  46.     uchar    pnum[12][12],        /* 郵便番号 */
  47.         pknum[12][8],        /* 旧番号 */
  48.         numwork[12],        /* 取りワーク */
  49.         numbuff[64],        /* 入力用ワーク */
  50.         bdelim = '\0';        /* 直前のデリミタ */
  51.  
  52.     uchar    page_todou[12][10],    /* ページ用の都道府県ワーク */
  53.         page_kugun[12][32],    /* ページ用の市区郡ワーク */
  54.         page_tyouson[12][32],    /* ページ用の市内区・町村ワーク */
  55.         page_azamei[12][256],    /* ページ用の字名ワーク(50文字で打ち切り) */
  56.         page_yomi0[12][16],    /* ページ用読み(都道府県) */
  57.         page_yomi1[12][64],    /* ページ用読み(市区郡) */
  58.         page_yomi2[12][64],    /* ページ用読み(市内区・町村) */
  59.         page_yomi3[12][128];    /* ページ用読み(字名) */
  60.  
  61.  
  62.     struct _inpptr    inpp;
  63.  
  64.     len = strlen( input_str );
  65.  
  66.     /* もいっかい検査(1234-567 とかもここに来るので) */
  67.     /* なお、ハイフンは3桁目(0から数えて)にしか来ない */
  68.     if( !is_bangou_legal( input_str ) ) {
  69.  
  70.         printf("警告 701 : 郵便番号が入力されましたが、");
  71.         printf("ハイフン位置がおかしいか、");
  72.         printf("不正な記号が入力されています。|%s|\n", input_str );
  73.         puts("次のように指定して下さい。");
  74.         puts("\t新番号:nnnnnnn, nnn-nnnn");
  75.         puts("\t旧番号:nnn, nnnnn, nnn-nn");
  76.         return;
  77.     }
  78.  
  79.     if( len == 8 && input_str[3] == '-' ) {        /* ハイフン付き新番号 nnn-nnnn */
  80.         strcpy( bwork, input_str );        /* ワークにコピー */
  81.         /* 後ろ4桁を詰める */
  82.         for( i1=3; i1<=6; i1++ ) {
  83.             input_str[i1] = bwork[i1+1];
  84.         }
  85.         input_str[7] = '\0';
  86.         puts("新番号処理");
  87.         ydelim = '*';
  88.  
  89.     } else if( len == 6 && input_str[3] == '-' ) {    /* ハイフン付き旧番号 nnn-nn */
  90.         strcpy( bwork, input_str );
  91.         /* 後ろ2桁を詰める */
  92.         input_str[3] = bwork[4];
  93.         input_str[4] = bwork[5];
  94.         input_str[5] = '\0';
  95.         puts("旧番号(5桁)処理");
  96.         ydelim = '\'';
  97.  
  98.     } else if( len == 7 ) {                /* ハイフンなし新番号 nnnnnnn */
  99.         puts("新番号処理");
  100.         ydelim = '*';
  101.  
  102.     } else if( len == 5 ) {                /* ハイフンなし旧番号 nnnnn */
  103.         puts("旧番号(5桁)処理");
  104.         ydelim = '\'';
  105.  
  106.     } else if( len == 3 ) {                /* 旧番号 nnn */
  107.         puts("旧番号(3桁)処理");
  108.         ydelim = '\'';
  109.  
  110.     } else {
  111.         puts("警告 702 : 郵便番号の桁数が不正です。");
  112.         return;
  113.     }
  114.  
  115.     /* 番号検索 */
  116.     kensuu = 0;
  117.     ofs = 0;    /* 始めから */
  118.     do {
  119.         ofs = bm_find( ydelim, input_str, ofs );
  120.         if( ofs == -1 ) {
  121.             break;
  122.         }
  123.         if( kensuu == B_GEN ) {    /* 件数 == B_GEN で検索打ち切り */
  124.             uchikiri = 1;
  125.             break;
  126.         }
  127.  
  128.         /* ヒットしました */
  129.         if( is_not_delim( buf[ofs] ) ) {    /* 次位置がデリミタでない */
  130.             continue;
  131.         }
  132.         nextp = ofs;            /* 今のオフセットをとっておく */
  133.         if( buf[ofs] == '\'' ) {    /* 旧番号なら */
  134.             ofs++;
  135.             pass_next_han();    /* とばす */
  136.         }
  137.         b_ofs = ofs;
  138.  
  139.         /* 「以下の……」判定 */
  140.         if( buf[ofs] == '%' ) {        /* 次が字名なら */
  141.  
  142.             /* この番号が何に属しているか調べる */
  143.             ofs++;
  144.             pass_back_han( '+' );
  145.             ofs-= 2;
  146.             pass_back_han( '.' );    /* 前はなんだ */
  147.             ofs--;
  148.  
  149.             if( buf[ofs] != '%' ) {    /* 字名ではない=「以下の……」 */
  150.                 ofs = nextp;    /* オフセットを戻して */
  151.                 continue;    /* とばす */
  152.             }
  153.         }
  154.         ofs = b_ofs;
  155.         /* 「以下に掲載が……」がなかった */
  156.         point[ kensuu ] = ofs;    /* これはデリミタを指している */
  157.         kensuu++;
  158.         ofs = nextp;    /* オフセットを戻す */
  159.     } while( 1 );
  160.  
  161.     if( kensuu != 0 ) {    /* あった */
  162.  
  163.         gen_page = 1;            /* 1ページ目から */
  164.  
  165.         if( kensuu % 12 == 0 ) {
  166.             zen_page = kensuu / 12;
  167.         } else {
  168.             zen_page = kensuu / 12 + 1;
  169.         }
  170.  
  171.         if( zen_page == 0 ) {
  172.             zen_page = 1;
  173.         }
  174.  
  175.         mainlp = 1;
  176.         do {
  177.             _dos_c_cls_al();
  178.             status_print();
  179.             printf("該当件数 : %4d 件",kensuu );
  180.             if( uchikiri ) {    /* 検索を打ち切っていたら */
  181.                 printf("(打切)");
  182.             } else {
  183.                 printf("\t");
  184.             }
  185.             printf("\tページ : %2d / %2d\n", gen_page, zen_page);
  186.  
  187.             /* 基準値 */
  188.             kijun = (gen_page - 1) * 12;
  189.  
  190.             /* 実際に表示する件数 */
  191.             /* 1ページしかない、もしくは最終ページなら調整 */
  192.             if( gen_page == zen_page ) {
  193.                 if( zen_page >= 2 ) {
  194.                     lpcnt = kensuu - ((zen_page-1)*12);
  195.                 } else {
  196.                     lpcnt = kensuu;
  197.                 }
  198.             } else {
  199.                 lpcnt = 12;
  200.             }
  201.  
  202.             /* 初期化 */
  203.             for( i1=0; i1<=11; i1++ ) {
  204.                 page_todou[i1][0]     = '\0';
  205.                 page_kugun[i1][0]     = '\0';
  206.                 page_tyouson[i1][0]     = '\0';
  207.                 page_azamei[i1][0]     = '\0';
  208.                 page_yomi0[i1][0]     = '\0';
  209.                 page_yomi1[i1][0]     = '\0';
  210.                 page_yomi2[i1][0]     = '\0';
  211.                 page_yomi3[i1][0]     = '\0';
  212.                 pnum[i1][0]         = '\0';
  213.             }
  214.  
  215.             /* データを取ってくる */
  216.             for( i1=0; i1<=lpcnt-1; i1++ ) {
  217.                 ki = kijun + i1;
  218.                 ofs = point[ ki ];
  219.  
  220.                 /* 戻って、直前が字名か町村名かを調べる */
  221.                 /* 町村名なら一円 */
  222.                 lp = 1;
  223.                 ofs-=2;
  224.                 do {
  225.                     pass_back_han( '.' );
  226.                     ofs--;
  227.                     switch( buf[ofs] ) {
  228.                         case '%':
  229.                             bdelim = buf[ofs];
  230.                             lp = 0;
  231.                             break;
  232.  
  233.                         case ':':
  234.                         case ';':
  235.                             ichien[ki] = 1;
  236.                             bdelim = buf[ofs];
  237.                             lp = 0;
  238.                             break;
  239.  
  240.                         default:
  241.                             break;
  242.                     }
  243.                 } while( lp );
  244.  
  245.                 joukyou[ ki ] = bdelim;
  246.  
  247.                 /* 必ず字名から始まるとは限らない */
  248.                 /* →町村一円のケースもあるので */
  249.                 ofs++;
  250.                 aza_sw = 0;
  251.                 if( bdelim == '%' ) {    /* 字名 */
  252.                     /* 字名を得る */
  253.                     get_next_han( page_azamei[i1] );
  254.                     /* 50 字で打ち切り */
  255. //                    if( strlen( page_azamei[i1] ) >= 48 ) {
  256. //                        page_azamei[i1][48]='\0';
  257. //                        strcat( page_azamei[i1], "〈略〉" );
  258. //                    }
  259.                     get_next_han2( page_yomi3[i1] );    /* 読み */
  260.                     ofs++;
  261.                     get_next_num( numwork );
  262.                     number_seikei( numwork );
  263.                     strcpy( pnum[i1], " " );
  264.                     strcat( pnum[i1], numwork );
  265.                     ofs++;
  266.                     get_next_num( pknum[i1] );
  267.                     aza_sw = 1;
  268.  
  269.                     /* 市区郡町村(市内区も)デリミタに */
  270.                     /* ぶつかるまで、バックトレース */
  271.                     /* 得られたデリミタは、bdelim へ */
  272.                     bdelim = backtrace();
  273.                 }
  274.  
  275.                 if( bdelim == '!' ) {    /* 市名 */
  276.  
  277.                     /* 市名を得る */
  278.                     get_next_han( page_kugun[i1] );
  279.                     strcat( page_kugun[i1], "市" );
  280.                     get_next_han2( page_yomi1[i1] );
  281.  
  282.                     if( !aza_sw ) {    /* 字名が得られていない */
  283.  
  284.                         /* 政令指定都市であれば */
  285.                         if( seirei_check( page_kugun[i1] ) != -1 ) {
  286.  
  287.                             /* 市内区が unknown である */
  288.                             shitei_ku_unkn = 1;
  289.                         }
  290.                     }
  291.  
  292.                     /* 県へ戻る準備 */
  293.                     pass_back_han( ' ' );
  294.                     bdelim = ' ';
  295.                 }
  296.  
  297.                 if( bdelim == '\"' ) {    /* 特別区 */
  298.  
  299.                     /* 区名を得る */
  300.                     get_next_han( page_kugun[i1] );
  301.                     strcat( page_kugun[i1], "区" );
  302.                     get_next_han2( page_yomi1[i1] );
  303.  
  304.                     /* 特別区は東京都に決まっているのだけど */
  305.                     pass_back_han( ' ' );
  306.                     bdelim = ' ';
  307.                 }
  308.  
  309.                 if( bdelim == '$' ) {    /* 市内区 */
  310.  
  311.                     /* 市内区名を得る */
  312.                     get_next_han( page_tyouson[i1] );
  313.                     strcat( page_tyouson[i1], "区" );
  314.                     get_next_han2( page_yomi2[i1] );
  315.  
  316.                     /* 直前の市名を得る */
  317.                     pass_back_han( '!' );
  318.                     get_next_han( page_kugun[i1] );
  319.                     strcat( page_kugun[i1], "市" );
  320.                     get_next_han2( page_yomi1[i1] );
  321.  
  322.                     /* 県へ戻る準備 */
  323.                     pass_back_han( ' ' );
  324.                     bdelim = ' ';
  325.                 }
  326.  
  327.                 if( bdelim == ':' ) {    /* 町名 */
  328.  
  329.                     /* 町名を得る */
  330.                     get_next_han( page_tyouson[i1] );
  331.                     strcat( page_tyouson[i1], "町" );
  332.                     get_next_han2( page_yomi2[i1] );
  333.                     if( !aza_sw ) {
  334.                         ichien_check2( ichien[ki],
  335.                             pnum[i1], pknum[i1] );
  336.                     }
  337.  
  338.                     /* 郡へ戻る準備 */
  339.                     pass_back_han( '#' );
  340.                     bdelim = '#';
  341.                 }
  342.  
  343.                 if( bdelim == ';' ) {    /* 村名 */
  344.  
  345.                     /* 町名を得る */
  346.                     get_next_han( page_tyouson[i1] );
  347.                     strcat( page_tyouson[i1], "村" );
  348.                     get_next_han2( page_yomi2[i1] );
  349.                     if( !aza_sw ) {
  350.                         ichien_check2( ichien[ki],
  351.                             pnum[i1], pknum[i1] );
  352.                     }
  353.  
  354.                     /* 郡へ戻る準備 */
  355.                     pass_back_han( '#' );
  356.                     bdelim = '#';
  357.                 }
  358.  
  359.                 if( bdelim == '#' ) {    /* 郡名 */
  360.  
  361.                     /* 郡名を得る */
  362.                     get_next_han( page_kugun[i1] );
  363.                     strcat( page_kugun[i1], "郡" );
  364.                     get_next_han2( page_yomi1[i1] );
  365.  
  366.                     /* 島しょはヌルに */
  367.                     if( strcmp( page_kugun[i1], "島しょ郡" ) == 0 ) {
  368.                         strcpy( page_kugun[i1], "" );
  369.                         strcpy( page_yomi1[i1], "" );
  370.                     }
  371.  
  372.                     /* 県へ戻る準備 */
  373.                     pass_back_han( ' ' );
  374.                     bdelim = ' ';
  375.                 }
  376.  
  377.                 if( bdelim == ' ' ) {    /* 県名 */
  378.  
  379.                     /* 県名を得る */
  380.                     get_next_han( page_todou[i1] );
  381.                     get_next_han2( page_yomi0[i1] );
  382.  
  383.                 } else {
  384.                     printf("異常 703 : 番号検索で県名を突破した\n");
  385.  
  386.                     printf("point[ki]=|%d|\n",point[ki]);
  387.                     printf("joukyou[ki]=|%c|\n",joukyou[ki]);
  388.                     printf("page_todou[i1]=|%s|\n",page_todou[i1]);
  389.                     printf("page_kugun[i1]=|%s|\n",page_kugun[i1]);
  390.                     printf("page_tyouson[i1]=|%s|\n",page_tyouson[i1]);
  391.                     printf("page_azamei[i1]=|%s|\n",page_azamei[i1]);
  392.                     printf("bdelim=|%c|\n",bdelim);
  393.                     printf("\n");
  394.  
  395.                     return;
  396.                 }
  397.  
  398.                 printf("%4d: ", ki+1 );    /* 件数表示 */
  399.  
  400.                 switch( joukyou[ki] ) {
  401.  
  402.                     case '%':
  403.                         printf("字名\t");
  404.                         break;
  405.                     case ':':
  406.                         printf("町名\t");
  407.                         break;
  408.                     case ';':
  409.                         printf("村名\t");
  410.                         break;
  411.                     default:
  412.                         printf("\t\t");
  413.                         break;
  414.                 }
  415.  
  416.                 /* 桁揃え */
  417.                 keta( page_todou[i1], page_yomi0[i1] );
  418.                 keta( page_kugun[i1], page_yomi1[i1] );
  419.                 keta( page_tyouson[i1], page_yomi2[i1] );
  420.                 keta( page_azamei[i1], page_yomi3[i1] );
  421.  
  422.                 /* 読みの表示 */
  423.                 printf(" ");
  424.                 kugiri();
  425.                 printf("%s",page_yomi0[i1]);
  426.                 kugiri();
  427.                 if( page_yomi1[i1][0] != '\0' ) {
  428.                     printf("%s", page_yomi1[i1] );
  429.                     kugiri();
  430.                 }
  431.                 if( page_yomi2[i1][0] != '\0' ) {
  432.                     printf("%s", page_yomi2[i1] );
  433.                     kugiri();
  434.                 }
  435.                 if( page_yomi3[i1][0] != '\0' ) {
  436.                     printf("%s", page_yomi3[i1] );
  437.                     kugiri();
  438.                 }
  439.                 puts("");
  440.  
  441.                 /* 次の行 */
  442. //番号は必ず分かっている
  443. //                if( pnum[i1][0] != '\0' ) {    /* 番号が分かっていれば */
  444.                     if( k_suppress ) {
  445.                         printf("\t");
  446.                     } else {
  447.                         k_num_disp( pknum[i1] );
  448.                     }
  449.                     printf("%s", pnum[i1] );    /* 郵便番号表示 */
  450. //                } else {
  451. //                    printf("\t\t");
  452. //                }
  453.                 kugiri();
  454.  
  455.                 /* 地名の表示 */
  456.                 printf("%s",page_todou[i1]);
  457.                 kugiri();
  458.                 if( page_kugun[i1][0] != '\0' ) {
  459.                     printf("%s",page_kugun[i1]);
  460.                     kugiri();
  461.                 }
  462.                 if( page_tyouson[i1][0] != '\0' ) {
  463.                     printf("%s",page_tyouson[i1]);
  464.                     kugiri();
  465.                 }
  466.                 if( page_azamei[i1][0] != '\0' ) {
  467.                     printf("%s",page_azamei[i1]);
  468.                     kugiri();
  469.                 }
  470.                 if( pnum[i1][0] == '*' ) {
  471.                     printf("(全域)");
  472.                 }
  473.                 puts("");
  474.             }
  475.  
  476.             /* キー入力 */
  477.             puts("");
  478.             printf("地名選択:番号");
  479.             printf(" 字名切替:a 旧番号切替:k 区切:d 厳密検索:g\n");
  480.             if( gen_page != zen_page ) {        /* 最終ページなら*/
  481.                 printf("次ページ:n ");    /* 「次ページ」を表示しない */
  482.             }
  483.             if( gen_page != 1 ) {            /* 1ページ目なら */
  484.                 printf("前ページ:b ");    /* 「前ページ」を表示しない */
  485.             }
  486.             printf("次検索:p 終了:q or e\n");
  487.             inpp.max = 64;
  488.             inpp.length = 64;
  489.  
  490.             lp = 1;
  491.             do{
  492.                 fep_off();
  493.                 _dos_gets( &inpp );
  494.                 strcpy( numbuff, inpp.buffer );
  495.  
  496.                 if( numbuff[0] == 'q' || numbuff[0] == 'Q' ||
  497.                     numbuff[0] == 'e' || numbuff[0] == 'E' ) {
  498.                     puts("");
  499.                     exit( 0 );
  500.  
  501.                 } else if( numbuff[0] == 'k' || numbuff[0] == 'K' ) {
  502.                     /* 旧番号モードトグル */
  503.                     if( k_suppress ) {
  504.                         k_suppress = 0;
  505.                     } else {
  506.                         k_suppress = 1;
  507.                     }
  508.                     break;
  509.  
  510.                 } else if( numbuff[0] == 'a' || numbuff[0] == 'A' ) {
  511.                     /* 字名モードトグル */
  512.                     if( azamei_gentei ) {
  513.                         azamei_gentei = 0;
  514.                     } else {
  515.                         azamei_gentei = 1;
  516.                     }
  517.                     break;
  518.  
  519.                 } else if( numbuff[0] == 'd' || numbuff[0] == 'D' ) {
  520.                     /* 区切りモードトグル */
  521.                     if( kugiri_mode ) {
  522.                         kugiri_mode = 0;
  523.                     } else {
  524.                         kugiri_mode = 1;
  525.                     }
  526.                     break;
  527.  
  528.                 } else if( numbuff[0] == 'g' || numbuff[0] == 'G' ) {
  529.                     /* 区切りモードトグル */
  530.                     if( genmitsu_mode ) {
  531.                         genmitsu_mode = 0;
  532.                     } else {
  533.                         genmitsu_mode = 1;
  534.                     }
  535.                     break;
  536.  
  537.                 } else if( numbuff[0] == 'n' || numbuff[0] == 'N' ||
  538.                        numbuff[0] == '\0' ) {
  539.                     /* 次のページへ */
  540.                     if( gen_page != zen_page ) {
  541.                         gen_page++;
  542.                         break;
  543.                     }
  544.                 } else if( numbuff[0] == 'b' || numbuff[0] == 'B' ) {
  545.                     /* 前のページへ */
  546.                     if( gen_page != 1 ) {
  547.                         gen_page--;
  548.                         break;
  549.                     }
  550.  
  551.                 } else if( numbuff[0] == 'p' || numbuff[0] == 'P' ) {
  552.                     /* 次検索へ */
  553.                     dokuji_sw = 1;
  554.                     return;
  555.                 }
  556.  
  557.                 /* 漢字かカナが入力された? */
  558.                 if( ismbblead( numbuff[0] ) ||        /* 1文字はダメよ */
  559.                   ( ismbbkana( numbuff[0] ) && strlen( numbuff ) >= 2 ) ) {
  560.                     dokuji_sw = 1;
  561.                     exist_moji = 1;
  562.                     strcpy( input_str, numbuff );
  563.                     return;
  564.                 }
  565.  
  566.                 /* 番号が合っているなら終わり */
  567.                 s_num = atoi( numbuff );
  568.                 if( s_num >= kijun+1 && s_num <= kijun+lpcnt ) {
  569.                     mainlp = 0;
  570.                     break;
  571.                 }
  572.  
  573.                 /* 合っていないなら、郵便番号か? */
  574.                 if( is_bangou_legal( numbuff ) ) {    /* 番号なら */
  575.                     dokuji_sw = 1;
  576.                     exist_moji = 1;
  577.                     strcpy( input_str, numbuff );    /* 番号として検索 */
  578.                     return;
  579.                 }
  580.  
  581.             } while ( lp );
  582.  
  583.         } while( mainlp );
  584.  
  585.         /* 選択された */
  586.         lpcnt = s_num % 12 - 1;    /* ページ中何番が選択されたか? */
  587.         if( lpcnt == -1 ) {
  588.             lpcnt = 11;
  589.         }
  590.         puts("");
  591.  
  592.         _dos_c_cls_al();
  593.  
  594.         /* 解析結果の表示 */
  595.         printf("\t   %s", page_yomi0[lpcnt] );        /* 読みがなの表示 */
  596.         if( page_yomi1[lpcnt][0] != '\0' ) {
  597.             kugiri();
  598.             printf("%s", page_yomi1[lpcnt] );
  599.         }
  600.         if( page_yomi2[lpcnt][0] != '\0' ) {
  601.             kugiri();
  602.             printf("%s", page_yomi2[lpcnt] );
  603.         }
  604.         kugiri();
  605.         printf("\n");
  606.         printf("解析結果 : %s", page_todou[lpcnt] );
  607.         kugiri();
  608.         if( page_kugun[lpcnt][0] != '\0' ) {
  609.             printf("%s", page_kugun[lpcnt] );
  610.             kugiri();
  611.         }
  612.         if( page_tyouson[lpcnt][0] != '\0' ) {
  613.             printf("%s", page_tyouson[lpcnt] );
  614.             kugiri();
  615.         }
  616.         printf("\n\n");
  617.  
  618.         /* 1件しかないね? */
  619.         if( pnum[lpcnt][0] == '*' ) {
  620.             printf("%s%s", page_todou[lpcnt], page_kugun[lpcnt] );
  621.             if( page_tyouson[lpcnt][0] != '\0' ) {
  622.                 moji_pr( page_tyouson[lpcnt], input_str );
  623.             }
  624.             printf("内の郵便番号はすべて %s ", &pnum[lpcnt][1] );
  625.             if( !k_suppress ) {
  626.                 k_num_disp( pknum[lpcnt] );
  627.             }
  628.             printf(" です。\n");
  629.  
  630.         } else {
  631.  
  632.             if( !k_suppress ) {
  633.                 k_num_disp( pknum[lpcnt] );
  634.             }
  635.             printf("%s", &pnum[lpcnt][1]  );    /* 頭は表示しない */
  636.             printf(": ");
  637.             moji_pr( page_azamei[lpcnt], input_str );
  638.             printf("(%s)\n", page_yomi3[lpcnt] );
  639.         }
  640.  
  641.         dokuji_sw = 1;
  642.  
  643.     } else {    /* kensuu は 0 、つまりヒットしなかった */
  644.  
  645.         puts("警告 704 : 入力された郵便番号は見つかりませんでした。");
  646.     }
  647.  
  648.     return;
  649. }
  650.  
  651.  
  652. /*
  653.     一円チェック(その2)
  654.  
  655.     町村内がすべて同一郵便番号の場合、pnum に書き込む
  656.  
  657.     「以下に掲載が……」の場合、1 を返す
  658. */
  659. void
  660. ichien_check2( int ichien, uchar *pnum, uchar *knum )
  661. {
  662.     uchar    numwork[8];    /* 郵便番号ワーク */
  663.  
  664.     ofs++;
  665.     get_next_num( numwork );
  666.     number_seikei( numwork );
  667.     ofs++;
  668.     get_next_num( knum );
  669.  
  670.     if( buf[ofs] != '%' ) {        /* 字名がない */
  671.         if( ichien ) {
  672.             strcpy( pnum, "*" );
  673.             strcat( pnum, numwork );    /* 一円である */
  674.         } else {
  675.             return;
  676.         }
  677.     }
  678.  
  679.     return;
  680. }
  681.  
  682.  
  683. /*
  684.     郵便番号検査
  685.  
  686.     フォーマットがおかしければ、0を返す
  687. */
  688. int
  689. is_bangou_legal( uchar *bangou )
  690. {
  691.     int    len,        /* bangou 長さ */
  692.         i1;        /* ループ汎用 */
  693.  
  694.     len = strlen( bangou );
  695.  
  696.     /* 長さが違うなら、違う */
  697.     if( len != 3 && len != 5 && len != 6 && len != 7 && len != 8 ) {
  698.         return 0;
  699.     }
  700.  
  701.     /* ハイフン位置は正しいか? */
  702.     for( i1=0; i1<=len-1; i1++ ) {
  703.         if(    (len == 6 && (i1 == 3 && bangou[i1] == '-')) ||
  704.             (len == 8 && (i1 == 3 && bangou[i1] == '-')) ) {
  705.             continue;        /* ハイフンはとばす */
  706.         }
  707.         if( !isdigit( bangou[i1] ) ) {    /* 数字でないなら */
  708.             return 0;            /* イリーガル */
  709.         }
  710.     }
  711.  
  712.     return 1;    /* 生き残ったらリーガル */
  713. }
  714.